# Copyright (c) 2012 OpenStack Foundation
# All Rights Reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.

import os

import fixtures

from neutron.agent.linux import utils
from neutron.openstack.common import log as logging
from neutron.tests import base


LOG = logging.getLogger(__name__)


class RootwrapTestExec(base.BaseTestCase):
    """Simple unit test to test the basic rootwrap mechanism

    Essentially hello-world.  Just run a command as root and check that
    it actually *did* run as root, and generated the right output.

    NB that this is named _test_rootwrap so as not to get run by default
    from scripts like tox.  That's because it actually executes a sudo'ed
    command, and that won't work in the automated test environment, at
    least as it stands today.  To run this, rename it to
    test_rootwrap.py, or run it by hand.
    """

    def setUp(self):
        super(RootwrapTestExec, self).setUp()
        self.cwd = os.getcwd() + "/../../.."
        # stuff a stupid bash script into /tmp, so that the next
        # method can execute it.
        self.test_file = self.useFixture(
            fixtures.TempDir()).join("rootwrap-test.sh")
        with open(self.test_file, 'w') as f:
            f.write('#!/bin/bash\n')
            f.write('ID=`id | sed \'s/uid=//\' | sed \'s/(.*//\' `\n')
            f.write("echo $ID $1\
\" Now is the time for all good men to come \
to the aid of their party.\"\n")
        # we need a temporary conf file, pointing into pwd for the filter
        # specs. there's probably a better way to do this, but I couldn't
        # figure it out.  08/15/12 -- jrd
        self.conf_file = self.useFixture(
            fixtures.TempDir()).join("rootwrap.conf")
        with open(self.conf_file, 'w') as f:
            f.write("# temporary conf file for rootwrap-test, " +
                    "generated by test_rootwrap.py\n")
            f.write("[DEFAULT]\n")
            f.write("filters_path=" + self.cwd +
                    "/neutron/tests/etc/rootwrap.d/")
        # now set the root helper to sudo our rootwrap script,
        #  with the new conf
        self.root_helper = "sudo " + self.cwd + "/bin/neutron-rootwrap "
        self.root_helper += self.conf_file

    def runTest(self):
        try:
            result = utils.execute(["bash", self.test_file, 'arg'],
                                   self.root_helper)
            self.assertEqual(result,
                             "0 arg Now is the time for all good men to \
come to the aid of their party.")
        except Exception:
            LOG.exception("Losing in rootwrap test")

    def tearDown(self):
        os.remove(self.test_file)
        os.remove(self.conf_file)
        super(RootwrapTestExec, self).tearDown()
